package com.candy.demo5;

import com.candy.jdbcutil.JDBCUtilsConfig;
import com.candy.pojo.Student;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.*;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 * QueryRunner数据查询操作
 * 调用QueryRunner类方法query（Connection conn,String sql,ResultSetHandler r,Object...params）
 * ResultSetHandler r 结果集的处理方法，传递ResultSetHandler接口实现类
 * Object...params SQL语句中的？占位符
 *
 * 注意：query方法返回值，返回的是T 泛型，具体返回值类型，跟随结果集处理方式变化
 *
 */
public class QueryRunnerDemo1 {
    private  static Connection conn = JDBCUtilsConfig.getConnextion();
    public static void main(String[] args) throws SQLException {
        //arrayHandler();
        //arrayListHandler();
        //beanHandler();
        //beanListHandler();
        //columnListHandler();
        //scalarHandler();
        //mapHandler();
        mapListHandler();
    }
    /**
     * 结果集的第八种处理方法：MapListHandler
     * 将结果集每一行存储到一个Map集合，键：列名，值：数据
     * Map集合过多，存储到List集合
     */
    public static void mapListHandler() throws SQLException {
        QueryRunner qr = new QueryRunner();
        String sql = "select * from tb_student";
        //调用方法query传递结果集实现类MapListHandler
        List<Map<String,Object>> list=qr.query(conn,sql,new MapListHandler());
        for(Map<String,Object> map:list){
            for(String key:map.keySet()){
                System.out.print(key+".."+map.get(key));
            }
            System.out.println();
        }
    }

    /**
     * 结果集的第七种处理方法：MapHandler
     * 将结果集第一行数据封装到map集合中
     * Map<键，值>键：列名 值：这列的数据
     */
    public static void mapHandler() throws SQLException {
        QueryRunner qr =new QueryRunner();
        String sql = "select * from tb_student";
        //调用方法query，传递结果集实现类MapHandler
        //返回值：Map集合，接口实现类，泛型
        Map<String,Object> map=qr.query(conn,sql,new MapHandler());
        for(String key:map.keySet()){
            System.out.println(key+".."+map.get(key));
        }
    }

    /**
     * 结果集的第六种处理方法：ScalarHandler
     * 对于查询后，只有一个结果
     */
    public static void scalarHandler() throws SQLException {
        QueryRunner qr=new QueryRunner();
        String sql = "select Count(*) from tb_student";
        //调用方法query，传递结果集处理实现类ScalarHandler
        Long count=qr.query(conn,sql,new ScalarHandler<Long>());
        System.out.println(count);
    }


    /**
     * 结果集的第五种处理方法：ColumnListHandler
     * 结果集，指定列的数据，存储到List集合
     * List<Object>每个列数据类型不同
     */
    public static void columnListHandler() throws SQLException {
        QueryRunner qr = new QueryRunner();
        String sql = "select * from tb_Student";
        //调用方法query，传递结果集的实现类ColumnListHandler
        //实现类构造方法中，实验字符串的列名
        List<Object> list=qr.query(conn,sql,new ColumnListHandler<Object>("name"));
        for(Object obj:list){
            System.out.println(obj);
        }
    }

    /**
     * 结果集的第四种处理方法：BeanListHandler
     * 结果集每一行每一行数据，封装JavaBean对象
     * 多个JavaBean对象，存储到List集合
     */
    public static void beanListHandler() throws SQLException {
        QueryRunner qr = new QueryRunner();
        String sql = "select * from tb_Student";
        //调用方法query，传递结果集处理实现类BeanListHandler
        List<Student> list = qr.query(conn,sql,new BeanListHandler<Student>(Student.class));
        for (Student su:list){
            System.out.println(su);
        }
    }

    /**
     * 结果集的第三种处理方法：BeanHandler
     * 将结果集的第一行数据，封装成JAVABean对象
     * 注意：被封装成数据到JAVABean对象，Student类必须有空参数构造
     */
    public static void beanHandler() throws SQLException {
        QueryRunner qr = new QueryRunner();
        String sql = "select * from tb_student";
        //调用方法，传递结果集实现类BeanHandler
        //BeanHandler(CLass<T> type)
        Student su = qr.query(conn,sql,new BeanHandler<Student>(Student.class));
        System.out.println(su);


    }

    /**
     * 结果集第二种处理方法，ArrayListHan
     * 将结果集的每一行，封装到对象数组整，出现很多对象数组
     * 对象数组存储到List集合
     */
    public static void arrayListHandler() throws SQLException {
        QueryRunner qr = new QueryRunner();
        String sql = "select * from tb_student";
        //调用query方法，结果集处理的参数上，传递实现类ArrayListHandler
        //方法返回值 没行是一个对象数组，存储到List
        List<Object[]> result = qr.query(conn,sql,new ArrayListHandler());
        //集合的遍历
        for (Object[] objs:result) {
            for(Object obj:objs){
                System.out.print(obj+" ");
            }
            System.out.println();
        }
    }

    /**
     * 结果集第一种处理方法：ArrayHandler
     * 将结果集的第一行存储到对象数组中Object[]
     */
    public static void arrayHandler() throws SQLException {
        QueryRunner qr = new QueryRunner();
        String sql = "select * from tb_student";
        //调用方法query执行查询，传递连接诶对象，sql语句，结果集处理方式的结果集
        //返回对象数组
        Object[] result = qr.query(conn,sql,new ArrayHandler());
        for(Object obj:result){
            System.out.print(obj+"\t");
        }
    }
}
